package cn.design;

import cn.design.realize.BroochClothesDecorator;
import cn.design.realize.ButtonClothesDecorator;
import cn.design.realize.ClothesComponent;
import cn.design.realize.ClothesDecorator;
import cn.design.realize.TxConcreteClothesComponent;

/**
 * @author dlq
 * @description 装饰模式 客户端类：  DecoratorClient
 * @date 2020/9/18 13:50
 * @since 1.0
 */
public class DecoratorClientDemo {
    public static void main(String[] args) {
        //实例：
        // 所有对外（这里不仅仅是客户端类）,也包括其他引用，都以抽象接口引用
        //1. ClothesComponent 这个是抽象接口组件--衣服的抽象组件
        //2.  TxConcreteClothesComponent -- 具体组件 , 衣服的具体组件
        // 3. ClothesDecorator -- 抽象修饰类 ，实现类：BroochClothesDecorator(胸针修饰类),ButtonClothesDecorator(纽扣修饰类)

        //代码--- 给 T恤 按上 胸针 和 纽扣 不可能是同步进行，顺序 纽扣--> 胸针 或者 胸针 ---> 纽扣
        // 在T恤上先把 胸针 安上后 ，然后再给出T恤 ，然后按上 纽扣
         //1. 创建一个T恤
        ClothesComponent clothesComponent = new TxConcreteClothesComponent();
        //2. 给T恤按上纽扣
        ClothesDecorator buttonDecorator = new ButtonClothesDecorator(clothesComponent);
        buttonDecorator.produceClothes();

        //3. 给T恤按上胸针
        ClothesDecorator broochDecorator = new BroochClothesDecorator(clothesComponent);
        buttonDecorator.produceClothes();

        //另一个故事场景：
        // 做煎饼
        // 抽象构件类 煎饼 ,
        // 具体 构件： 鸡蛋煎饼
        //  抽象修饰接口： 调料
        //  具体的修饰类：  辣椒粉, 甜面酱 ....等其它调料

    }
}
